function [Li] = polylog(n, x)
%POLYLOG - 多重对数函数.
%
% 语法:
%   Li = polylog(n, x);     - 返回 n 阶自变量为 x 的多重对数函数.
%
% 示例:
% >> Li = [polylog(3, -1/2), polylog(4, 1/3), polylog(5, 3/4)]
% -0.4726    0.3408    0.7697
% >> symLi = polylog(5, sym(3/4))
% polylog(5, 3/4)
% >> Li = vpa(symLi)
% 0.76973541059975738097269173152535
% >> Li = polylog(-0.2i, 2.5)
% -2.5030 + 0.3958i
%
% >> x = sym('x');
% >> Li = polylog(1, x)
% -log(1 - x)
% >> Li = polylog(0, x)
% -x/(x - 1)
% >> Li = polylog(-3, x)
% x*(x**2 + 4*x + 1)/(x - 1)**4
%
% >> n = sym('n');
% >> Li = polylog(n, 0)
% 0
% >> Li = polylog(n, 1)
% zeta(n)
% >> Li = polylog(n, -1)
% -dirichlet_eta(n)
% >> Li = polylog(4, sym(1))
% pi**4/90
% >> Li = polylog(sym(5), -1)
% -dirichlet_eta(5)
% >> Li = polylog(2, sp.I)
% -pi**2/48 + Catalan*I
%
% >> dLi = symdiff(polylog(n, x), x)
% polylog(n - 1, x)/x
% >> dLI = symdiff(x*polylog(n, x), x)
% polylog(n, x) + polylog(n - 1, x)
% >> intLi = symint(polylog(n, x)/x, x)
% polylog(n + 1, x)
%
    sp = sympy_sp;
    Li = sp.polylog(n, x);
    explicit = @(n) n <= 1 && n == fix(n) && ~isinf(n);

    if isnumeric(x) && isnumeric(n)
        Li = vpa(Li);
        py = pyroot;
        if isreal(n) && isreal(x)
            Li = py.float(Li);
        else
            Li = py.complex(Li);
            Li = Li.real + Li.imag * 1i;
        end
    elseif isnumeric(n) && explicit(n)
        Li = sp.expand_func(Li);
        Li = sp.factor(Li);
    end
end

